package thread

import java.util.concurrent.Callable
import java.util.concurrent.Executors
import java.util.concurrent.Future
import java.util.concurrent.FutureTask

//使用Runnable和Thread来创建一个新的线程，run方法是没有返回值的。
//而有时候希望开启一个线程去执行一个任务，并且这个任务执行完成后有一个返回值。
class Task : Callable<Long> {

    override fun call(): Long {
        Thread.sleep(2000)
        return System.currentTimeMillis()
    }

}

fun main() {
    //Callable一般是配合线程池工具ExecutorService来使用的。
    //示例一：
    val executor = Executors.newCachedThreadPool()
    val task = Task()
    val future: Future<Long> = executor.submit(task)
    println("结果1：${future.get()}")

    //示例二：
    //搭配FutureTask
    //在很多高并发的环境下，有可能Callable和FutureTask会创建多次。
    //FutureTask能够在高并发环境下确保任务只执行一次。
    val futureTask: FutureTask<Long> = FutureTask(task)
    executor.submit(futureTask)
    println("结果2：${futureTask.get()}")
}